#pragma once
#include <iostream>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <string>
#include <sys/types.h>
#include <sys/ipc.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

#include "time .hxx"
using namespace std;

// 给shm 设置指定项目名称
const string itemstr = "/root/learn/code";
// 给shm 设置一个项目编号
const int itemnum = 10721;

const int gsize = 4096;

const mode_t gmode = 0600;

// 在2024/10/31 学习到的一个新命令  可以定时执行一个命令
// while true ; do ipcs -m  ; sleep 2 ; done

void ToHex(int data)
{
    char str[100];
    int size = snprintf(str, 100, "0x%x", data);
    str[size] = 0;
    cout << "获取的key为:" << str << endl;
}

class shmid
{
public:
    shmid() {}

    // 获取key_t值
    void GetKey()
    {
        _key = ftok(itemstr.c_str(), itemnum);
        ToHex(_key);
    }

    void CreatShemid()
    {
        _shareid = shmget(_key, gsize, IPC_CREAT | IPC_EXCL | gmode);
        if (_shareid == -1)
        {
            cout << "创建共享内存失败" << endl;
            return;
        }
        cout << "创建共享内存成功!" << endl;
    }

    void Attchshm()
    {
        _shmaddr = shmat(_shareid, nullptr, 0);
        if ((long long)_shareid == -1)
        {
            cout << "绑定进程地址空间失败" << endl;
        }
        printf("绑定进程地址空间为:%p\n", _shmaddr);
    }

    void Deattch()
    {
        shmdt(_shmaddr);
    }

    // void Setinfo()
    // {
    //     char ch='A';
    //     string str;
    //     while(ch<='Z')
    //     {
    //         str+=ch;
    //         cout<<"发送信息"<<str<<endl;
    //         sprintf(_shmaddr,"%s",str.c_str());
    //         sleep(2);
    //         ch++;
    //     }
    //     str="end";
    //     sprintf(_shmaddr,"%s",str.c_str());
    // }

    // void Getinfo()
    // {
    //     while (flag!=-1)
    //     {
    //         if(strcmp(_shmaddr,"end")==0)
    //         {
    //             break;
    //         }
    //         cout<<"已收到信息:";
    //         cout<<_shmaddr<<endl;
    //         sleep(2);
    //     }
    // }

    void Getshmid()
    {
        _shareid = shmget(_key, gsize, IPC_EXCL);
    }

    void Rmshm()
    {
        shmctl(_shareid, IPC_RMID, nullptr);
    }

    void *Addr()
    {
        return _shmaddr;
    }

private:
    key_t _key;
    int _shareid;
    void *_shmaddr;
    int flag = 0;
};

shmid info;

struct shinfo
{
    char time[32];
    char status[8];
};
